package com.gl.wxstore.common;

import com.gl.wxstore.common.model._MappingKit;
import com.gl.wxstore.index.IndexController;
import com.gl.wxstore.store.controller.OrderController;
import com.gl.wxstore.sys.controller.ProduceController;
import com.gl.wxstore.sys.controller.SysUserController;
import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.core.JFinal;
import com.jfinal.ext.handler.FakeStaticHandler;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.c3p0.C3p0Plugin;
import com.jfinal.render.ViewType;

/**
 * API引导式配置
 *
 * @author Hsu。
 * @since Jan 9, 2017
 */
public class Config extends JFinalConfig {

	/**
	 * 配置常量
	 */
	@Override
	public void configConstant(Constants me) {
		// 1、读取数据库配置
		// loadPropertyFile("config.properties");
		PropKit.use("config.properties");
		// getPropertyToBoolean("devMode", false);
		// 2、是否为开发者模式，默认为false
		me.setDevMode(PropKit.getBoolean("devMode", true));
		// 3、设置视图类型，默认是FREE_MARKER
		me.setViewType(ViewType.JSP);
		// 4、设置视图的默认寻找路径
		// me.setBaseViewPath("/WEB-INF/views");
		// 5、设置上传路径，默认为upload
		// me.setBaseUploadPath("upload");
		// 6、设置下载路径，默认为download
		// me.setBaseDownloadPath("download");
		// 7、设置生成JSON的时间格式
		// me.setJsonDatePattern("yyyy-MM-dd HH:mm:ss");
		// me.setJsonFactory(FastJsonFactory.me());
		// 8、设置日志工厂
		// me.setLogFactory(Slf4JLogFactory.me());
		// 9、...
	}

	/**
	 * 配置路由
	 */
	@Override
	public void configRoute(Routes me) {
		me.add("/", IndexController.class);
		me.add("/user", SysUserController.class);
		me.add("/product", ProduceController.class);
		me.add("/order", OrderController.class);
	}

	/**
	 * <pre>
	 * 配置插件。
	 * JFinal内置了activerecord、c3p0、druid、ehcache、redis五款插件，扩展插件需实现IPlugin接口
	 * </pre>
	 */
	@Override
	public void configPlugin(Plugins me) {
		// 配置C3p0数据库连接池插件
		C3p0Plugin c3p0Plugin = new C3p0Plugin(PropKit.get("jdbcUrl"), PropKit.get("user"),
				PropKit.get("password").trim());
		me.add(c3p0Plugin);

		// 配置ActiveRecord插件
		ActiveRecordPlugin arp = new ActiveRecordPlugin(c3p0Plugin);
		arp.setShowSql(true);
		me.add(arp);

		// 表和Model映射
		_MappingKit.mapping(arp);
	}

	/**
	 * 配置全局拦截器
	 */
	@Override
	public void configInterceptor(Interceptors me) {

	}

	/**
	 * <pre>
	 * 配置处理器
	 * 1、Handler优先于Interceptor执行
	 * 2、Handler是AOP+责任链模式的变种，链条的末端就是ActionHandler，用来处理动作请求和拦截
	 * 3、Handler拦截所有请求（包括静态资源），Interceptor只拦截对Controller的请求
	 * 4、在JFinal中，不是特殊的需要是用不到Handler的，普通的拦截请求使用Interceptor即可
	 * </pre>
	 */
	@Override
	public void configHandler(Handlers me) {
		me.add(new FakeStaticHandler());
	}

	/**
	 * JFinal启动后执行的操作
	 */
	@Override
	public void afterJFinalStart() {

	}

	/**
	 * JFinal停止前执行的操作
	 */
	@Override
	public void beforeJFinalStop() {

	}

	public static void main(String[] args) {
		JFinal.start("webapp", 8080, "/", 5);
	}

}
